package com.qidian.buy.common.util;

import java.util.concurrent.*;

/**
 * @author 戴着假发的程序员
 * @company 起点编程
 * @date 2024/7/16 13:58
 */
public class ThreadPoolUtil {
    // 这里的静态map是用来缓存我们当前项目中所有的线程池的，每个线程池都有独立的name
    private static ConcurrentHashMap<String, ExecutorService>  pools = new ConcurrentHashMap();

    // 提供一个方法可以通过名字来获取线程池对象
    public static ExecutorService getPool(String name){
        // 判断当前的pools中是否存在你需要的线程池
        if(pools.containsKey(name)){
            // 如果存在就直接返回对应的线程池
            return pools.get(name);
        }
        // 如果不存在，就创建一个新的线程池，并且缓存起来
        // 参数1： 核心线程数
        // 参数2： 最大线程数
        // 参数3： 线程空闲等待的最长时间
        // 参数4： 线程空闲等待时间的单位
        // 参数5： 缓存队列（阻塞队列）
        // 参数6： 创建线程的工厂  一般都是使用Executors的默认工厂
        // 参数7： 拒绝策略
        ExecutorService executor = new ThreadPoolExecutor(
                5,
                5,
                60L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
                );
        // 缓存这个线程池
        pools.put(name,executor);
        // 返回新创建的线程池对象
        return executor;
    }
}
